#include <stdio.h>
#include <stdlib.h>

/**
 * 链表开始
 * */
typedef struct node
{
    int data;
    struct node *next;
} LinkNode;

// 初始化一个链表，存放1-5；尾部插入法
LinkNode *init()
{
    // 申请头节点
    LinkNode *head = (LinkNode *)malloc(sizeof(LinkNode));
    //保存一个中间节点，每次新的节点代替它
    LinkNode *temp = head;

    for (int i = 0; i < 5; i++)
    {
        printf("init %d \n", i);
        // 新节点
        LinkNode *new = (LinkNode *)malloc(sizeof(LinkNode));

        new->data = i;
        new->next = NULL;

        temp->next = new;

        temp = new;
    }
    return head;
}
/**
 * 通过下标查询
 * */
LinkNode *GetListNode(LinkNode *node, int index)
{
    LinkNode *item = node->next;
    int i = 1;
    while (item && i < index)
    {
        item = item->next;
        i++;
    }
    if (index == i)
    {
        return item;
    }
    return NULL;
}
/**
 * 按照值查找
 * */
LinkNode *GetListNodeValue(LinkNode *node, int val)
{
    LinkNode *item = node->next;
    while (item)
    {
        if (item->data == val)
        {
            return item;
        }
        item = item->next;
    }
    return NULL;
}
/**
 * 将指定的值插入指定的位置
 * */
void InsertListNode(LinkNode *node, int index, int val)
{
    LinkNode *item = node->next;
    int i = 1;
    while (item && i < index)
    {
        item = item->next;
        i++;
    }
    if (i == index)
    {
        // 申请新节点
        LinkNode *new = (LinkNode *)malloc(sizeof(LinkNode));

        new->data = val;
        new->next = item->next;

        item->next = new;
    }
    else
    {
        printf("index error \n");
    }
}
// 删除第i个节点，
int deleteList(LinkNode *node, int index)
{
    int i = 1;

    //上节点
    LinkNode *point = node;
    //下节点（也是要删除的节点）
    LinkNode *item = node->next;

    while (item && i <= index)
    {
        /* code */
        point = item;
        item = item->next;
        ++i;
    }
    if (item == NULL)
    {
        printf("index error \n");
        exit(0);
    }
    else
    {
        LinkNode *del = item;
        point->next = item->next;

        int data = item->data;
        //释放内存
        free(del);
        return data;
    }
}

// 打印当前链表
void printLinkList(LinkNode *list)
{
    LinkNode *item = list->next;
    while (item)
    {
        printf("value= %d \n", item->data);
        item = item->next;
    }
}

void main()
{
    LinkNode *node = init();
    printLinkList(node);
    printf("----------- \n");
    LinkNode *n1 = GetListNode(node, 5);
    printf("get node=%d \n", n1->data);
    printf("----------- \n");
    LinkNode *n2 = GetListNodeValue(node, 6);
    printf("get node value= \n", n2);
    printf("----------- \n");
    InsertListNode(node, 3, 11);
    printLinkList(node);
    printf("----------- \n");
    int del = deleteList(node, 5);
    printf("del value=%d \n", del);
    printLinkList(node);
}
